package cn.tedu.exception;

import java.util.InputMismatchException;
import java.util.Scanner;

/**
 * @Author 金帮嘉诚
 * @Date 2021-06-10 周四 20:39
 */
/*本类用于测试*/
public class ExceptionDemo {
    public static void main(String[] args) {
        //InputMismatchException--类型不符合
        //ArithmeticException: / by zero--算数异常
        /*1.不要害怕BUG，真的勇士敢于直面自己写的BUG
        * 2.学会看报错的信息提示，确定自己的出错方向
        * 3.学会看报错的行号信息，确定自己报错的位置，哪里不对点哪里
        * 注意：源码不会出错，我们要看的是自己的代码*/
//        method1();//调用 人为暴露异常--看看异常长啥样
//        method2();//异常解决方案1-捕获处理
//        method3();//异常解决方案2--交给调用者解决
        f();//为了写一个标准的写法，在main方法调用之前，处理掉异常
    }

    private static void f(){
        try {
            method3();
        }catch (Exception e){//可以通过编程解决的异常
            System.out.println("请输入正确的数据");
        }
    }
    /*如果一个方法抛出了异常，谁调用了这个方法，谁就要处理这个异常
    * 这里的解决也是两种方案：捕获异常或者继续向上抛出，
    * 但是注意：我们一般会在main方法之前解决掉异常
    * 而不是把问题抛给main，因为没人解决了，详见本类f方法调用method3方法
    * */
    /*异常抛出的格式：大括号和小括号间写： throws 异常类型*/
    /*如果有多个异常类型，用”，“逗号隔开即可*/
    private static void method3() throws InputMismatchException,ArithmeticException{
        System.out.println("请输入您要计算的第一个整数");
        int a=new Scanner(System.in).nextInt();
        System.out.println("请输入您要计算的第二个整数");
        int b=new Scanner(System.in).nextInt();
        System.out.println("a/b = " + a/b);

    }

    private static void method2() {
        /**先写结构再写代码，提前布局，谋定而后动，未雨绸缪，居安思危*/
        /*4.try中放着的是可能出错的代码
        * 5.如果发生了异常会被catch捕获，执行catch中提供的解决方案*/
        try {
            System.out.println("请输入您要计算的第一个整数");
            int a = new Scanner(System.in).nextInt();
            System.out.println("请输入您要计算的第二个整数");
            int b = new Scanner(System.in).nextInt();
            System.out.println("a/b = " + a / b);
        }catch (InputMismatchException e){
            System.out.println("输入异常");
        }catch (ArithmeticException e){
            System.out.println("算数异常");
        }catch (Exception e){
            System.out.println("异常");
        }
        /*6.try-catch可以嵌套，如果有多种异常类型需要特殊处理*/
        /*7.这就是多态最为经典的一种用法，我们并不关心子类的具体类型
        * 而是将子类统一作为父类类型来处理，提供通用的解决方案*/

    }

    private static void method1() {
        System.out.println("请输入您要计算的第一个整数");
        int a=new Scanner(System.in).nextInt();
        System.out.println("请输入您要计算的第二个整数");
        int b=new Scanner(System.in).nextInt();
        System.out.println("a/b = " + a/b);
    }
}
